package com.songtech.base.universal.controller;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.songtech.base.universal.dao.util.AbstractBaseDao;
import com.songtech.base.universal.dao.util.ThrowsExceptionUtil;

@Service
public class UniversalService extends AbstractBaseDao {
	/**
	 * 调用自定义的mybatis添加数据
	 * @param methodName 需要调用的mybatis添加方法
	 * @param map 参数对象
	 * @return 
	 * @throws SQLException 
	 */
	public int insert(String methodName, Map<String, ?> map) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(methodName);
		return this.getSqlSession().insert(methodName, map);
	}
	
	/**
	 * 调用自定义的mybatis修改数据
	 * @param methodName 需要调用的mybatis修改方法
	 * @param map 参数对象，可以传null
	 * @return
	 * @throws SQLException 
	 */
	public int update(String methodName, Map<String, ?> map) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(methodName);
		return this.getSqlSession().update(methodName, map);
	}
	
	/**
	 * 调用自定义的mybatis删除数据
	 * @param methodName 需要调用的mybatis删除方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	public int delete(String methodName, Map<String, ?> map) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(methodName);
		return this.getSqlSession().delete(methodName, map);
	}
	
	/**
	 * 调用自定义的mybatis查询一条数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	public Object selectOne(String methodName, Map<String, ?> map) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(methodName);
		return this.getSqlSession().selectOne(methodName, map);
	}
	
	/**
	 * 调用自定义的mybatis查询一条数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @return
	 * @throws SQLException 
	 */
	@Cacheable(value = "selectOneUseRedis")
	public Object selectOneUseRedis(String methodName, Map<String, ?> map) throws SQLException {
		return this.selectOne(methodName, map);
	}
	
	/**
	 * 调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException 
	 */
	public PageInfo<?> selectList(String methodName, Map<String, ?> map, Page<?> page) throws SQLException {
		ThrowsExceptionUtil.throwNullParametersException(methodName);
		if(page != null && page.getPageNum() > 0 && page.getPageSize() > 0){
			PageHelper.startPage(page.getPageNum(), page.getPageSize());
		}
		
		List<?> list = this.getSqlSession().selectList(methodName, map);
		return new PageInfo<>(list);
	}
	
	/**
	 * 调用自定义的mybatis查询数据
	 * @param methodName 需要调用的mybatis查询方法
	 * @param map 参数对象
	 * @param page 分页标签，可以传null
	 * @return
	 * @throws SQLException 
	 */
	@Cacheable(value = "selectListUseRedis")
	public PageInfo<?> selectListUseRedis(String methodName, Map<String, ?> map, Page<?> page) throws SQLException {
		return this.selectList(methodName, map, page);
	}
}
